#pragma warning disable 108
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using Cephei;
using Cephei.Core;
using Cephei.Core.Generic;
using Microsoft.FSharp.Core;
namespace Cephei.QL.Times
{
    /// <summary> 
	/// ! This class provides methods for determining whether a date is a business day or a holiday for a given market, and for incrementing/decrementing a date of a given number of business days.  The Bridge pattern is used to provide the base behavior of the calendar, namely, to determine whether a date is a business day.  A calendar should be defined for specific exchange holiday schedule or for general country holiday schedule. Legacy city holiday schedule calendars will be moved to the exchange/country convention.  \ingroup datetime  \test the methods for adding and removing holidays are tested by inspecting the calendar before and after their invocation.
	/// </summary>
    [Guid ("4331BA5A-7C27-41be-8A9F-852287431337"),ComVisible(true)]
	public interface ICalendar 
	{
		///////////////////////////////////////////////////////////////
        // Methods
        //
        /// <summary> 
		/// 
		/// </summary>
		 ICalendar AddHoliday(DateTime d);
        /// <summary> 
		/// 
		/// </summary>
		 DateTime Adjust(DateTime d, Microsoft.FSharp.Core.FSharpOption<QL.Times.BusinessDayConventionEnum> convention);
        /// <summary> 
		/// 
		/// </summary>
		 DateTime Advance(DateTime date, Cephei.QL.Times.IPeriod period, Microsoft.FSharp.Core.FSharpOption<QL.Times.BusinessDayConventionEnum> convention, Microsoft.FSharp.Core.FSharpOption<Boolean> endOfMonth);
        /// <summary> 
		/// 
		/// </summary>
		 DateTime Advance(DateTime d, Int32 n, QL.Times.TimeUnitEnum unit, Microsoft.FSharp.Core.FSharpOption<QL.Times.BusinessDayConventionEnum> convention, Microsoft.FSharp.Core.FSharpOption<Boolean> endOfMonth);
        /// <summary> 
		/// 
		/// </summary>
		 Int64 BusinessDaysBetween(DateTime from, DateTime to, Microsoft.FSharp.Core.FSharpOption<Boolean> includeFirst, Microsoft.FSharp.Core.FSharpOption<Boolean> includeLast);
        /// <summary> 
		/// 
		/// </summary>
		 Boolean Empty {get;}
        /// <summary> 
		/// 
		/// </summary>
		 DateTime EndOfMonth(DateTime d);
        /// <summary> 
		/// 
		/// </summary>
		 Cephei.Core.IVector<DateTime> HolidayList(Cephei.QL.Times.ICalendar calendar, DateTime from, DateTime to, Microsoft.FSharp.Core.FSharpOption<Boolean> includeWeekEnds);
        /// <summary> 
		/// 
		/// </summary>
		 Boolean IsBusinessDay(DateTime d);
        /// <summary> 
		/// 
		/// </summary>
		 Boolean IsEndOfMonth(DateTime d);
        /// <summary> 
		/// 
		/// </summary>
		 Boolean IsHoliday(DateTime d);
        /// <summary> 
		/// 
		/// </summary>
		 Boolean IsWeekend(QL.Times.WeekdayEnum w);
        /// <summary> 
		/// 
		/// </summary>
		 String Name {get;}
        /// <summary> 
		/// 
		/// </summary>
		 ICalendar RemoveHoliday(DateTime d);
    }   

    /// <summary> 
	/// ! This class provides methods for determining whether a date is a business day or a holiday for a given market, and for incrementing/decrementing a date of a given number of business days.  The Bridge pattern is used to provide the base behavior of the calendar, namely, to determine whether a date is a business day.  A calendar should be defined for specific exchange holiday schedule or for general country holiday schedule. Legacy city holiday schedule calendars will be moved to the exchange/country convention.  \ingroup datetime  \test the methods for adding and removing holidays are tested by inspecting the calendar before and after their invocation. Factory
	/// </summary>
   	[ComVisible(true)]
    public interface ICalendar_Factory 
    {
        ///////////////////////////////////////////////////////////////
        // Factory methods
        //
        /// <summary> 
		/// 
		/// </summary>
	    ICalendar Create ();
    }
}

